function [save_now,error]=problem_3_1(process,change,speed,wash)
%情况三 一道工序

change=repmat(change,1,4);

        pos=1;
        time_remaining=zeros(1,8);%八个CNC完成当前工作剩余时间
        state=zeros(1,8);%记录CNC当前状态 工作或空闲
        t=0;
        expect_t=ones(4,8);%预计时间 分别为预计移动时间 预计等待时间 预计上下件时间 三者和
        save_now=[];%保存结果
        error=[];%保存故障情况 每列为 故障时的物料序号 故障CNC编号	故障开始时间	故障结束时间 故障是否解决
        

        while t<=28800
            for i=1:size(error,1)%更新故障情况
                if t>=error(i,3)&&t<=error(i,4)&&error(i,5)==0
                    error(i,5)=1;%故障已经解决
                    time_remaining(error(i,2))=error(i,4)-t;
                    state(error(i,2))=0;
                end
            end
           
            
            for k=1:8%计算预计时间
                expect_t(1,k)=speed(1+abs(pos-ceil(k/2)));
                expect_t(2,k)=time_remaining(k);
                expect_t(3,k)=change(k);
                expect_t(4,k)=sum(expect_t((1:3),k));
            end
            
            %% 移动
            %寻找当前工序的下一个目标位置，并移动至该位置
            [~,min_num]=min(expect_t(4,:));
            t=t+expect_t(1,min_num);
            
            flag=0;
            for i=1:size(error,1)%移动后检查CNC工作情况
                if t>=error(i,3) && t<=error(i,4) &&error(i,5)==0 && min_num==error(i,2)%移动途中原CNC损坏
                    error(i,5)=1;
                    state(error(i,2))=0;
                    
                    %更新CNC时间
                    for j=1:8
                        if time_remaining(j)-expect_t(1,min_num)<0
                            time_remaining(j)=0;
                        else
                            time_remaining(j)=time_remaining(j)-expect_t(1,min_num);
                        end
                    end
                    
                    time_remaining(error(i,2))=error(i,4)-t; %当前工作剩余时间是故障修复的时间
                
                    flag=1;
                end
            end
            
            %如果发生故障 则结束本次循环 重新判断
            if flag==1
                continue;
            end
            
            %% 等待
            flag=0;
            for i=1:size(error,1)
                if t<=error(i,3) && t+expect_t(2,min_num)>=error(i,3) && error(i,5)==0 && error(i,2)==min_num %等待过程中原工件损坏
                    error(i,5)=1;
                    state(error(i,2))=0;
                    
                    %更新CNC时间
                    for j=1:8
                        if time_remaining(j)-(error(i,3)-t)<0
                            time_remaining(j)=0;
                        else
                            time_remaining(j)=time_remaining(j)-(error(i,3)-t);
                        end
                    end
                    time_remaining(error(i,2))=error(i,4)-error(i,3);% 等待时间为故障修复时间
                    t=error(i,3);
                    flag=1;
                end
            end
            
            if flag==1
                continue;
            end
            
            t=t+expect_t(2,min_num);%正常完成等待
            
            %% 上下料
            flag=0;
            for i=size(save_now,1):-1:1
                if save_now(i,1)==min_num && isnan(save_now(i,3))%即上料又下料
                    flag=1;
                    save_now(i,3)=t;%记录下料时间
                    save_now=[save_now;min_num,t,NaN];%记录上料时间
                    break;
                end
            end
            
            if flag==0%只上料
                save_now=[save_now;min_num,t,NaN];
            end
            
            %% 清洗
            if state(min_num)==0%不清洗
                state(min_num)=1;
                t=t+expect_t(3,min_num);
                
                %更新CNC时间
                for j=1:8
                    if time_remaining(j)-expect_t(4,min_num)<0
                        time_remaining(j)=0;
                    else
                        time_remaining(j)=time_remaining(j)-expect_t(4,min_num);
                    end
                end
                time_remaining(min_num)=process;
                
                if unifrnd(0,100)>=99%
                    start_t=t+unifrnd(0,process);% 在任意加工时间内开始出现故障
                    repair_t=unifrnd(600,1200);%故障修复时间随机
                    error=[error;size(save_now,1),min_num,start_t,start_t+repair_t,0];%保存故障记录
                end
                
            else%清洗
                t=t+expect_t(3,min_num)+wash;
                
                %更新CNC时间
                for j=1:8
                    if time_remaining(j)-expect_t(4,min_num)-wash<0
                        time_remaining(j)=0;
                    else
                        time_remaining(j)=time_remaining(j)-expect_t(4,min_num)-wash;
                    end
                end
                time_remaining(min_num)=process-wash;
                
                if unifrnd(0,100)>=99%
                    start_t=t-wash+unifrnd(0,process);% 在任意加工时间内开始出现故障
                    repair_t=unifrnd(600,1200);%故障修复时间随机
                    error=[error;size(save_now,1),min_num,start_t,start_t+repair_t,0];%保存故障记录
                end
            end
            
            pos=ceil(pos/2);%更新位置
        end
            
end


